跳到主要内容

关系代数简介

这篇材料更加适合那些已经在数据库领域有了一定积淀的读者们阅读,它是对SQL所依托的形式化语言模型,即关系代数的介绍。

尽管在实践中,关系代数直接应用较少,但是,对于那些于SQL语言的设计,SQL性能提升,乃至于数据库查询优化器感兴趣的读者而言,它必不可少。


关系代数的基本运算符号

运算符名称描述
σ\sigma选择运算符用于在关系数据当中提取元组(选择行)
⨿\amalg投影运算符用于在关系数据当中提取属性(选择列)
\bigcup并运算符对关系代数表达式的结果进行整合
-差运算符用于删减某张关系数据中的元组
××笛卡尔积运算符用于对关系间元组进行全排序

其它的关系代数运算均构建于这些基本运算之上。

使用关系代数方法操作关系型数据

假定存在关系 Book

nameauthorpriceid
《程序员修炼之道》David Thomas, Andrew Hunt891
《SQL学习指南》Alan Beaulieu322
《贞观政要》吴兢543
《管子》管仲504
《C程序设计语言》Brian W.Kernighan, Dennis M.Ritchie305

自 Book 中提取数据行

自关系数据表中提取数据行需要使用选择运算σ\sigma,其基本格式如下:

σ条件表达式(关系数据表)\sigma_{条件表达式}(关系数据表)

比如,假如我们希望自 Book 中提取书名为《程序员修炼之道》的书籍:

σname=“《程序员修炼之道》”(Book)\sigma_{name=“《程序员修炼之道》”(Book)}

或者,我们希望提取价格大于45的书籍:

σprice>45(Book)\sigma_{price>45(Book)}

条件表达式可以通过逻辑谓词进行整合,假如我们希望选择序列号大于3而价格低于40的书籍:

σid>3^price<40(Book)\sigma_{id>3\text{\textasciicircum}price<40(Book)}

自 Book 中选择数据列

自关系数据表中提取数据行需要使用投影运算⨿\amalg,其基本格式如下:

⨿数据列(关系数据表)\amalg_{数据列}(关系数据表)

假定,现在我们希望了解到书籍与其对应的价格,就可以使用如下的表达式:

⨿name,price(Book)\amalg_{name, price}(Book)

或者,现在我们希望掌握作者与书籍的对应关系,则可以使用:

⨿name,author(Book)\amalg_{name, author}(Book)

对查询的结果进行整合

在实践当中,数据查询往往需要对多个数据源(其它的简单数据查询)的结果进行整合,这就需要我们使用并运算来解决问题,并运算的基本格式如下:

(关系运算表达式)(关系运算表达式)(关系运算表达式)\bigcup(关系运算表达式)

其中,参与运算的关系数据其属性数目必须相同,且能够一一对应。

差运算符

差运算符自某张关系数据表中挖去另外一张关系数据表的数据,其基本格式如下:

(原关系数据)(需要删减的关系数据)(原关系数据)- (需要删减的关系数据)

同样要求属性数据相同且能够一一对应。

笛卡尔积运算符

笛卡尔积运算实际上就是对于数张关系数据表元组的全排序,其基本格式如下:

(关系)×(关系)(关系)×(关系)